package com.demo.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author linchong
 * @version 1.0
 * @Date: 2022-05-14 19:21
 * @Description: MethodCollector$
 * 1.批量的：
 *  public Method[] getMethods():获取所有的“公共方法”；（包含父类的方法，也包含Object类）
 *  public Method[] getDeclaredMethods()：获取所有的成员方法，包括私有的，不包括继承的
 * 2.获取单个的
 *  public Method getMethod(String name,Class <?> ...parameterTypes)
 *      参数，
 *          name:方法名
 *          Class...:形参的Class类型对象
 *  public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 *
 *  3.调用方法
 *      Method --> public Object invoke(Object obj,Object ... args)
 *         参数：
 *              obj:要调用的对象
 *              args:调用方式时所传递的实参*
 */
public class MethodCollector {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
		Class reflectTargetClass = Class.forName("com.demo.reflect.ReflectTarget");
		System.out.println("**********获取所有public方法，包括父类和Object类***********");
		Method[] methods = reflectTargetClass.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}

		System.out.println("**********获取所有方法，包括私有的**********************");
		methods = reflectTargetClass.getDeclaredMethods();
		for (Method method : methods) {
			System.out.println(method);
		}

		System.out.println("**************获取单个公共方法*******************");
		Method m = reflectTargetClass.getMethod("show1",String.class);
		System.out.println(m);

		ReflectTarget instance = (ReflectTarget) reflectTargetClass.getConstructor().newInstance();
		m.invoke(instance,"show 1");

		m = reflectTargetClass.getDeclaredMethod("show4",int.class);
		m.setAccessible(true);
		System.out.println(m);
		String result = String.valueOf(m.invoke(instance,2));
		System.out.println(result);

	}
}
